/**
 *  Serponix is an arcade game in focus to multiplayer based on the classic game Snake.
 *  Copyright (C) 2010 - 2011  Daniel Vala
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License,
 *  or  any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.

 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 *  If you have any question do not hesitate to contact author
 *  on e-mail address: danielvala42@gmail.com
 */
package com.serponix.game.objektyNaPlose;

import com.serponix.game.*;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Polygon;

/**
 * Článek hada obsahuje informace o tom, jakému hadovi patří 
 * a kolikátý jeho článek je.
 * Poskytuje také metody pro vykreslení různých typů článků.
 * @author Daniel Vala
 */
public class Clanek extends VecNaPolicku {

    private Snake had;

    public Clanek(Snake had, int x, int y) {
        super(x, y);
        this.had = had;
    }

    public Clanek(Snake had) {
        this.had = had;
    }

    public Snake getHad() {
        return had;
    }

    /**
     * Vykreslí článek hada na dané souřadnice.
     * @param g2d Grafický objekt, kterým se bude kreslit.
     * @param x Souřadnice článku X.
     * @param y Souřadnice článku Y.
     * @param tloustka Tlouštka článku.
     */
    public static void paint(Graphics2D g2d, int x, int y, int tloustka) {
        x *= tloustka;
        y *= tloustka;
        g2d.fill3DRect(x, y, tloustka, tloustka, true);
    }

    /**
     * Vykreslí článek odolného hada na dané souřadnice.
     * @param g2d Grafický objekt, kterým se bude kreslit.
     * @param x Souřadnice článku X.
     * @param y Souřadnice článku Y.
     * @param tloustka Tlouštka článku.
     */
    public static void paintOdolny(Graphics2D g2d, int x, int y, int tloustka) {
        x *= tloustka;
        y *= tloustka;
        g2d.draw3DRect(x, y, tloustka, tloustka, false);
    }

    /**
     * Vykreslí článek ducha hada na dané souřadnice, což jsou malé čtverečky.
     * @param g2d Grafický objekt, kterým se bude kreslit.
     * @param x Souřadnice článku X.
     * @param y Souřadnice článku Y.
     * @param tloustka Tlouštka článku.
     */
    public static void paintDuch(Graphics2D g2d, int x, int y, int tloustka) {
        x *= tloustka;
        y *= tloustka;
        g2d.fillRect(x + (tloustka / 3), y + (tloustka / 3), (tloustka / 2), (tloustka / 2));
    }

    /**
     * Nastaví předaný grafický objekt na průhlednost, při které se kreslí neviditelný článek hada.
     * @param g2d Grafický objekt, který se nastaví na průhlednost.
     */
    public static void NastavNeviditelneKresleni(Graphics2D g2d) {
        g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f));
    }

    /**
     * Vykreslí hlavu hada do zadaných souřadnic podle zadaného směru a tlouštky.
     * Je třeba předem nastavit barvu článku.
     * @param g2d
     * @param x Souřadnice hlavy x.
     * @param y Souřadnice hlavy y.
     * @param tloustka Tlouštka hlavy.
     * @param smer Směr článku, podle kterého bude hlava natočena. Při zadání směru NIKAM nebo null nevykreslí nic.
     */
    public static void paintHlava(Graphics2D g2d, int x, int y, int tloustka, Direction smer) {
        x *= tloustka;
        y *= tloustka;
        int velikostOka = tloustka / 10;
        int posunOkaDoprostred = tloustka / 5;
        int posunOkaPodelHavy = tloustka / 10;

        Color puvodniBarva = g2d.getColor();
        switch (smer) {
            case UP:
                g2d.fillArc(x, y + (tloustka / 2), tloustka, tloustka, 0, 180);
                g2d.setPaint(Color.BLACK);
                g2d.fillOval(x + posunOkaDoprostred, y + (tloustka - posunOkaPodelHavy - velikostOka), velikostOka, velikostOka);
                g2d.fillOval(x + (tloustka - posunOkaDoprostred - velikostOka), y + (tloustka - posunOkaPodelHavy - velikostOka), velikostOka, velikostOka);
                break;
            case DOWN:
                g2d.fillArc(x, y - (tloustka / 2), tloustka, tloustka, 0, -180);
                g2d.setPaint(Color.BLACK);
                g2d.fillOval(x + posunOkaDoprostred, y + posunOkaPodelHavy, velikostOka, velikostOka);
                g2d.fillOval(x + (tloustka - posunOkaDoprostred - velikostOka), y + posunOkaPodelHavy, velikostOka, velikostOka);
                break;
            case LEFT:
                g2d.fillArc(x + (tloustka / 2), y, tloustka, tloustka, 90, 180);
                g2d.setPaint(Color.BLACK);
                g2d.fillOval(x + (tloustka - posunOkaPodelHavy - velikostOka), y + posunOkaDoprostred, velikostOka, velikostOka);
                g2d.fillOval(x + (tloustka - posunOkaPodelHavy - velikostOka), y + (tloustka - posunOkaDoprostred - velikostOka), velikostOka, velikostOka);
                break;
            case RIGHT:
                // kreslení hlavy
                g2d.fillArc(x - (tloustka / 2), y, tloustka, tloustka, 90, -180);
                // kreslení očí
                g2d.setPaint(Color.BLACK);
                // horní oko
                g2d.fillOval(x + posunOkaPodelHavy, y + posunOkaDoprostred, velikostOka, velikostOka);
                // dolní oko
                g2d.fillOval(x + posunOkaPodelHavy, y + (tloustka - posunOkaDoprostred - velikostOka), velikostOka, velikostOka);
                break;
        }
        // nastavení barvy tak, jak byla před voláním této metody
        g2d.setPaint(puvodniBarva);
    }

    /**
     * Vykreslí hlavu ve tvaru tanku (do špičky) do zadaných souřadnic podle zadaného směru a tlouštky.
     * Je třeba předem nastavit barvu článku.
     * @param g2d
     * @param x Souřadnice hlavy x.
     * @param y Souřadnice hlavy y.
     * @param tloustka Tlouštka hlavy.
     * @param smer Směr článku, podle kterého bude hlava natočena. Při zadání směru NIKAM nebo null nevykreslí nic.
     */
    public static void paintHlavaTank(Graphics2D g2d, int x, int y, int tloustka, Direction smer) {
        x *= tloustka;
        y *= tloustka;
        Polygon hlava = null;
        int[] xPoints = null;
        int[] yPoints = null;
        switch (smer) {
            case UP:
                xPoints = new int[]{x, x + tloustka, x + (tloustka / 2)};
                yPoints = new int[]{y + tloustka, y + tloustka, y};
                break;
            case DOWN:
                xPoints = new int[]{x, x + tloustka, x + (tloustka / 2)};
                yPoints = new int[]{y, y, y + tloustka};
                break;
            case RIGHT:
                xPoints = new int[]{x, x + tloustka, x};
                yPoints = new int[]{y, y + (tloustka / 2), y + tloustka};
                break;
            case LEFT:
                xPoints = new int[]{x + tloustka, x, x + tloustka};
                yPoints = new int[]{y, y + (tloustka / 2), y + tloustka};
                break;
            default:
                return;
        }
        hlava = new Polygon(xPoints, yPoints, 3);
        g2d.fillPolygon(hlava);
        g2d.draw(hlava);
    }
}
